home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / python2.6 / xml / dom / minidom.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  64.3 KB  |  2,098 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. '''minidom.py -- a lightweight DOM implementation.
  5.  
  6. parse("foo.xml")
  7.  
  8. parseString("<foo><bar/></foo>")
  9.  
  10. Todo:
  11. =====
  12.  * convenience methods for getting elements and text.
  13.  * more testing
  14.  * bring some of the writer and linearizer code into conformance with this
  15.         interface
  16.  * SAX 2 namespaces
  17. '''
  18. import xml.dom as xml
  19. from xml.dom import EMPTY_NAMESPACE, EMPTY_PREFIX, XMLNS_NAMESPACE, domreg
  20. from xml.dom.minicompat import *
  21. from xml.dom.xmlbuilder import DOMImplementationLS, DocumentLS
  22. _nodeTypes_with_children = (xml.dom.Node.ELEMENT_NODE, xml.dom.Node.ENTITY_REFERENCE_NODE)
  23.  
  24. class Node(xml.dom.Node):
  25.     namespaceURI = None
  26.     parentNode = None
  27.     ownerDocument = None
  28.     nextSibling = None
  29.     previousSibling = None
  30.     prefix = EMPTY_PREFIX
  31.     
  32.     def __nonzero__(self):
  33.         return True
  34.  
  35.     
  36.     def toxml(self, encoding = None):
  37.         return self.toprettyxml('', '', encoding)
  38.  
  39.     
  40.     def toprettyxml(self, indent = '\t', newl = '\n', encoding = None):
  41.         writer = _get_StringIO()
  42.         if encoding is not None:
  43.             import codecs
  44.             writer = codecs.lookup(encoding)[3](writer)
  45.         
  46.         if self.nodeType == Node.DOCUMENT_NODE:
  47.             self.writexml(writer, '', indent, newl, encoding)
  48.         else:
  49.             self.writexml(writer, '', indent, newl)
  50.         return writer.getvalue()
  51.  
  52.     
  53.     def hasChildNodes(self):
  54.         if self.childNodes:
  55.             return True
  56.         return False
  57.  
  58.     
  59.     def _get_childNodes(self):
  60.         return self.childNodes
  61.  
  62.     
  63.     def _get_firstChild(self):
  64.         if self.childNodes:
  65.             return self.childNodes[0]
  66.  
  67.     
  68.     def _get_lastChild(self):
  69.         if self.childNodes:
  70.             return self.childNodes[-1]
  71.  
  72.     
  73.     def insertBefore(self, newChild, refChild):
  74.         if newChild.nodeType == self.DOCUMENT_FRAGMENT_NODE:
  75.             for c in tuple(newChild.childNodes):
  76.                 self.insertBefore(c, refChild)
  77.             
  78.             return newChild
  79.         if newChild.nodeType not in self._child_node_types:
  80.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(newChild), repr(self)))
  81.         newChild.nodeType not in self._child_node_types
  82.         if newChild.parentNode is not None:
  83.             newChild.parentNode.removeChild(newChild)
  84.         
  85.         if refChild is None:
  86.             self.appendChild(newChild)
  87.         else:
  88.             
  89.             try:
  90.                 index = self.childNodes.index(refChild)
  91.             except ValueError:
  92.                 raise xml.dom.NotFoundErr()
  93.  
  94.             if newChild.nodeType in _nodeTypes_with_children:
  95.                 _clear_id_cache(self)
  96.             
  97.             self.childNodes.insert(index, newChild)
  98.             newChild.nextSibling = refChild
  99.             refChild.previousSibling = newChild
  100.             if index:
  101.                 node = self.childNodes[index - 1]
  102.                 node.nextSibling = newChild
  103.                 newChild.previousSibling = node
  104.             else:
  105.                 newChild.previousSibling = None
  106.             newChild.parentNode = self
  107.         return newChild
  108.  
  109.     
  110.     def appendChild(self, node):
  111.         if node.nodeType == self.DOCUMENT_FRAGMENT_NODE:
  112.             for c in tuple(node.childNodes):
  113.                 self.appendChild(c)
  114.             
  115.             return node
  116.         if node.nodeType not in self._child_node_types:
  117.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(node), repr(self)))
  118.         node.nodeType not in self._child_node_types
  119.         if node.nodeType in _nodeTypes_with_children:
  120.             _clear_id_cache(self)
  121.         
  122.         if node.parentNode is not None:
  123.             node.parentNode.removeChild(node)
  124.         
  125.         _append_child(self, node)
  126.         node.nextSibling = None
  127.         return node
  128.  
  129.     
  130.     def replaceChild(self, newChild, oldChild):
  131.         if newChild.nodeType == self.DOCUMENT_FRAGMENT_NODE:
  132.             refChild = oldChild.nextSibling
  133.             self.removeChild(oldChild)
  134.             return self.insertBefore(newChild, refChild)
  135.         if newChild.nodeType not in self._child_node_types:
  136.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(newChild), repr(self)))
  137.         newChild.nodeType not in self._child_node_types
  138.         if newChild is oldChild:
  139.             return None
  140.         
  141.         try:
  142.             index = self.childNodes.index(oldChild)
  143.         except ValueError:
  144.             None if newChild.parentNode is not None else newChild.nodeType == self.DOCUMENT_FRAGMENT_NODE
  145.             None if newChild.parentNode is not None else newChild.nodeType == self.DOCUMENT_FRAGMENT_NODE
  146.             raise xml.dom.NotFoundErr()
  147.         except:
  148.             None if newChild.parentNode is not None else newChild.nodeType == self.DOCUMENT_FRAGMENT_NODE
  149.  
  150.         self.childNodes[index] = newChild
  151.         newChild.parentNode = self
  152.         oldChild.parentNode = None
  153.         if newChild.nodeType in _nodeTypes_with_children or oldChild.nodeType in _nodeTypes_with_children:
  154.             _clear_id_cache(self)
  155.         
  156.         newChild.nextSibling = oldChild.nextSibling
  157.         newChild.previousSibling = oldChild.previousSibling
  158.         oldChild.nextSibling = None
  159.         oldChild.previousSibling = None
  160.         if newChild.previousSibling:
  161.             newChild.previousSibling.nextSibling = newChild
  162.         
  163.         if newChild.nextSibling:
  164.             newChild.nextSibling.previousSibling = newChild
  165.         
  166.         return oldChild
  167.  
  168.     
  169.     def removeChild(self, oldChild):
  170.         
  171.         try:
  172.             self.childNodes.remove(oldChild)
  173.         except ValueError:
  174.             raise xml.dom.NotFoundErr()
  175.  
  176.         if oldChild.nextSibling is not None:
  177.             oldChild.nextSibling.previousSibling = oldChild.previousSibling
  178.         
  179.         if oldChild.previousSibling is not None:
  180.             oldChild.previousSibling.nextSibling = oldChild.nextSibling
  181.         
  182.         oldChild.nextSibling = None
  183.         oldChild.previousSibling = None
  184.         if oldChild.nodeType in _nodeTypes_with_children:
  185.             _clear_id_cache(self)
  186.         
  187.         oldChild.parentNode = None
  188.         return oldChild
  189.  
  190.     
  191.     def normalize(self):
  192.         L = []
  193.         for child in self.childNodes:
  194.             if child.nodeType == Node.TEXT_NODE:
  195.                 data = child.data
  196.                 if data and L and L[-1].nodeType == child.nodeType:
  197.                     node = L[-1]
  198.                     node.data = node.data + child.data
  199.                     node.nextSibling = child.nextSibling
  200.                     child.unlink()
  201.                 elif data:
  202.                     if L:
  203.                         L[-1].nextSibling = child
  204.                         child.previousSibling = L[-1]
  205.                     else:
  206.                         child.previousSibling = None
  207.                     L.append(child)
  208.                 else:
  209.                     child.unlink()
  210.             L[-1].nodeType == child.nodeType
  211.             if L:
  212.                 L[-1].nextSibling = child
  213.                 child.previousSibling = L[-1]
  214.             else:
  215.                 child.previousSibling = None
  216.             L.append(child)
  217.             if child.nodeType == Node.ELEMENT_NODE:
  218.                 child.normalize()
  219.                 continue
  220.         
  221.         if L:
  222.             L[-1].nextSibling = None
  223.         
  224.         self.childNodes[:] = L
  225.  
  226.     
  227.     def cloneNode(self, deep):
  228.         if not self.ownerDocument:
  229.             pass
  230.         return _clone_node(self, deep, self)
  231.  
  232.     
  233.     def isSupported(self, feature, version):
  234.         return self.ownerDocument.implementation.hasFeature(feature, version)
  235.  
  236.     
  237.     def _get_localName(self):
  238.         pass
  239.  
  240.     
  241.     def isSameNode(self, other):
  242.         return self is other
  243.  
  244.     
  245.     def getInterface(self, feature):
  246.         if self.isSupported(feature, None):
  247.             return self
  248.         return None
  249.  
  250.     
  251.     def getUserData(self, key):
  252.         
  253.         try:
  254.             return self._user_data[key][0]
  255.         except (AttributeError, KeyError):
  256.             return None
  257.  
  258.  
  259.     
  260.     def setUserData(self, key, data, handler):
  261.         old = None
  262.         
  263.         try:
  264.             d = self._user_data
  265.         except AttributeError:
  266.             d = { }
  267.             self._user_data = d
  268.  
  269.         if key in d:
  270.             old = d[key][0]
  271.         
  272.         if data is None:
  273.             handler = None
  274.             if old is not None:
  275.                 del d[key]
  276.             
  277.         else:
  278.             d[key] = (data, handler)
  279.         return old
  280.  
  281.     
  282.     def _call_user_data_handler(self, operation, src, dst):
  283.         if hasattr(self, '_user_data'):
  284.             for data, handler in self._user_data.items():
  285.                 if handler is not None:
  286.                     handler.handle(operation, key, data, src, dst)
  287.                     continue
  288.             
  289.         
  290.  
  291.     
  292.     def unlink(self):
  293.         self.parentNode = None
  294.         self.ownerDocument = None
  295.         if self.childNodes:
  296.             for child in self.childNodes:
  297.                 child.unlink()
  298.             
  299.             self.childNodes = NodeList()
  300.         
  301.         self.previousSibling = None
  302.         self.nextSibling = None
  303.  
  304.  
  305. defproperty(Node, 'firstChild', doc = 'First child node, or None.')
  306. defproperty(Node, 'lastChild', doc = 'Last child node, or None.')
  307. defproperty(Node, 'localName', doc = 'Namespace-local name of this node.')
  308.  
  309. def _append_child(self, node):
  310.     childNodes = self.childNodes
  311.     if childNodes:
  312.         last = childNodes[-1]
  313.         node.__dict__['previousSibling'] = last
  314.         last.__dict__['nextSibling'] = node
  315.     
  316.     childNodes.append(node)
  317.     node.__dict__['parentNode'] = self
  318.  
  319.  
  320. def _in_document(node):
  321.     while node is not None:
  322.         if node.nodeType == Node.DOCUMENT_NODE:
  323.             return True
  324.         node = node.parentNode
  325.         continue
  326.         node.nodeType == Node.DOCUMENT_NODE
  327.     return False
  328.  
  329.  
  330. def _write_data(writer, data):
  331.     '''Writes datachars to writer.'''
  332.     data = data.replace('&', '&').replace('<', '<')
  333.     data = data.replace('"', '"').replace('>', '>')
  334.     writer.write(data)
  335.  
  336.  
  337. def _get_elements_by_tagName_helper(parent, name, rc):
  338.     for node in parent.childNodes:
  339.         if node.nodeType == Node.ELEMENT_NODE:
  340.             if name == '*' or node.tagName == name:
  341.                 rc.append(node)
  342.             
  343.         _get_elements_by_tagName_helper(node, name, rc)
  344.     
  345.     return rc
  346.  
  347.  
  348. def _get_elements_by_tagName_ns_helper(parent, nsURI, localName, rc):
  349.     for node in parent.childNodes:
  350.         if node.nodeType == Node.ELEMENT_NODE:
  351.             if localName == '*' or node.localName == localName:
  352.                 if nsURI == '*' or node.namespaceURI == nsURI:
  353.                     rc.append(node)
  354.                 
  355.             _get_elements_by_tagName_ns_helper(node, nsURI, localName, rc)
  356.             continue
  357.     
  358.     return rc
  359.  
  360.  
  361. class DocumentFragment(Node):
  362.     nodeType = Node.DOCUMENT_FRAGMENT_NODE
  363.     nodeName = '#document-fragment'
  364.     nodeValue = None
  365.     attributes = None
  366.     parentNode = None
  367.     _child_node_types = (Node.ELEMENT_NODE, Node.TEXT_NODE, Node.CDATA_SECTION_NODE, Node.ENTITY_REFERENCE_NODE, Node.PROCESSING_INSTRUCTION_NODE, Node.COMMENT_NODE, Node.NOTATION_NODE)
  368.     
  369.     def __init__(self):
  370.         self.childNodes = NodeList()
  371.  
  372.  
  373.  
  374. class Attr(Node):
  375.     nodeType = Node.ATTRIBUTE_NODE
  376.     attributes = None
  377.     ownerElement = None
  378.     specified = False
  379.     _is_id = False
  380.     _child_node_types = (Node.TEXT_NODE, Node.ENTITY_REFERENCE_NODE)
  381.     
  382.     def __init__(self, qName, namespaceURI = EMPTY_NAMESPACE, localName = None, prefix = None):
  383.         d = self.__dict__
  384.         d['nodeName'] = d['name'] = qName
  385.         d['namespaceURI'] = namespaceURI
  386.         d['prefix'] = prefix
  387.         d['childNodes'] = NodeList()
  388.         self.childNodes.append(Text())
  389.  
  390.     
  391.     def _get_localName(self):
  392.         return self.nodeName.split(':', 1)[-1]
  393.  
  394.     
  395.     def _get_name(self):
  396.         return self.name
  397.  
  398.     
  399.     def _get_specified(self):
  400.         return self.specified
  401.  
  402.     
  403.     def __setattr__(self, name, value):
  404.         d = self.__dict__
  405.         if name in ('value', 'nodeValue'):
  406.             d['value'] = d['nodeValue'] = value
  407.             d2 = self.childNodes[0].__dict__
  408.             d2['data'] = d2['nodeValue'] = value
  409.             if self.ownerElement is not None:
  410.                 _clear_id_cache(self.ownerElement)
  411.             
  412.         elif name in ('name', 'nodeName'):
  413.             d['name'] = d['nodeName'] = value
  414.             if self.ownerElement is not None:
  415.                 _clear_id_cache(self.ownerElement)
  416.             
  417.         else:
  418.             d[name] = value
  419.  
  420.     
  421.     def _set_prefix(self, prefix):
  422.         nsuri = self.namespaceURI
  423.         if prefix == 'xmlns':
  424.             if nsuri and nsuri != XMLNS_NAMESPACE:
  425.                 raise xml.dom.NamespaceErr("illegal use of 'xmlns' prefix for the wrong namespace")
  426.             nsuri != XMLNS_NAMESPACE
  427.         
  428.         d = self.__dict__
  429.         d['prefix'] = prefix
  430.         if prefix is None:
  431.             newName = self.localName
  432.         else:
  433.             newName = '%s:%s' % (prefix, self.localName)
  434.         if self.ownerElement:
  435.             _clear_id_cache(self.ownerElement)
  436.         
  437.         d['nodeName'] = d['name'] = newName
  438.  
  439.     
  440.     def _set_value(self, value):
  441.         d = self.__dict__
  442.         d['value'] = d['nodeValue'] = value
  443.         if self.ownerElement:
  444.             _clear_id_cache(self.ownerElement)
  445.         
  446.         self.childNodes[0].data = value
  447.  
  448.     
  449.     def unlink(self):
  450.         elem = self.ownerElement
  451.         if elem is not None:
  452.             del elem._attrs[self.nodeName]
  453.             del elem._attrsNS[(self.namespaceURI, self.localName)]
  454.             if self._is_id:
  455.                 self._is_id = False
  456.                 elem._magic_id_nodes -= 1
  457.                 self.ownerDocument._magic_id_count -= 1
  458.             
  459.         
  460.         for child in self.childNodes:
  461.             child.unlink()
  462.         
  463.         del self.childNodes[:]
  464.  
  465.     
  466.     def _get_isId(self):
  467.         if self._is_id:
  468.             return True
  469.         doc = self.ownerDocument
  470.         elem = self.ownerElement
  471.         if doc is None or elem is None:
  472.             return False
  473.         info = doc._get_elem_info(elem)
  474.         if info is None:
  475.             return False
  476.         if self.namespaceURI:
  477.             return info.isIdNS(self.namespaceURI, self.localName)
  478.         return info.isId(self.nodeName)
  479.  
  480.     
  481.     def _get_schemaType(self):
  482.         doc = self.ownerDocument
  483.         elem = self.ownerElement
  484.         if doc is None or elem is None:
  485.             return _no_type
  486.         info = doc._get_elem_info(elem)
  487.         if info is None:
  488.             return _no_type
  489.         if self.namespaceURI:
  490.             return info.getAttributeTypeNS(self.namespaceURI, self.localName)
  491.         return info.getAttributeType(self.nodeName)
  492.  
  493.  
  494. defproperty(Attr, 'isId', doc = 'True if this attribute is an ID.')
  495. defproperty(Attr, 'localName', doc = 'Namespace-local name of this attribute.')
  496. defproperty(Attr, 'schemaType', doc = 'Schema type for this attribute.')
  497.  
  498. class NamedNodeMap(object):
  499.     """The attribute list is a transient interface to the underlying
  500.     dictionaries.  Mutations here will change the underlying element's
  501.     dictionary.
  502.  
  503.     Ordering is imposed artificially and does not reflect the order of
  504.     attributes as found in an input document.
  505.     """
  506.     __slots__ = ('_attrs', '_attrsNS', '_ownerElement')
  507.     
  508.     def __init__(self, attrs, attrsNS, ownerElement):
  509.         self._attrs = attrs
  510.         self._attrsNS = attrsNS
  511.         self._ownerElement = ownerElement
  512.  
  513.     
  514.     def _get_length(self):
  515.         return len(self._attrs)
  516.  
  517.     
  518.     def item(self, index):
  519.         
  520.         try:
  521.             return self[self._attrs.keys()[index]]
  522.         except IndexError:
  523.             return None
  524.  
  525.  
  526.     
  527.     def items(self):
  528.         L = []
  529.         for node in self._attrs.values():
  530.             L.append((node.nodeName, node.value))
  531.         
  532.         return L
  533.  
  534.     
  535.     def itemsNS(self):
  536.         L = []
  537.         for node in self._attrs.values():
  538.             L.append(((node.namespaceURI, node.localName), node.value))
  539.         
  540.         return L
  541.  
  542.     
  543.     def has_key(self, key):
  544.         if isinstance(key, StringTypes):
  545.             return self._attrs.has_key(key)
  546.         return self._attrsNS.has_key(key)
  547.  
  548.     
  549.     def keys(self):
  550.         return self._attrs.keys()
  551.  
  552.     
  553.     def keysNS(self):
  554.         return self._attrsNS.keys()
  555.  
  556.     
  557.     def values(self):
  558.         return self._attrs.values()
  559.  
  560.     
  561.     def get(self, name, value = None):
  562.         return self._attrs.get(name, value)
  563.  
  564.     __len__ = _get_length
  565.     __hash__ = None
  566.     
  567.     def __cmp__(self, other):
  568.         if self._attrs is getattr(other, '_attrs', None):
  569.             return 0
  570.         return cmp(id(self), id(other))
  571.  
  572.     
  573.     def __getitem__(self, attname_or_tuple):
  574.         if isinstance(attname_or_tuple, tuple):
  575.             return self._attrsNS[attname_or_tuple]
  576.         return self._attrs[attname_or_tuple]
  577.  
  578.     
  579.     def __setitem__(self, attname, value):
  580.         if isinstance(value, StringTypes):
  581.             
  582.             try:
  583.                 node = self._attrs[attname]
  584.             except KeyError:
  585.                 node = Attr(attname)
  586.                 node.ownerDocument = self._ownerElement.ownerDocument
  587.                 self.setNamedItem(node)
  588.  
  589.             node.value = value
  590.         elif not isinstance(value, Attr):
  591.             raise TypeError, 'value must be a string or Attr object'
  592.         
  593.         node = value
  594.         self.setNamedItem(node)
  595.  
  596.     
  597.     def getNamedItem(self, name):
  598.         
  599.         try:
  600.             return self._attrs[name]
  601.         except KeyError:
  602.             return None
  603.  
  604.  
  605.     
  606.     def getNamedItemNS(self, namespaceURI, localName):
  607.         
  608.         try:
  609.             return self._attrsNS[(namespaceURI, localName)]
  610.         except KeyError:
  611.             return None
  612.  
  613.  
  614.     
  615.     def removeNamedItem(self, name):
  616.         n = self.getNamedItem(name)
  617.         if n is not None:
  618.             _clear_id_cache(self._ownerElement)
  619.             del self._attrs[n.nodeName]
  620.             del self._attrsNS[(n.namespaceURI, n.localName)]
  621.             if 'ownerElement' in n.__dict__:
  622.                 n.__dict__['ownerElement'] = None
  623.             
  624.             return n
  625.         raise xml.dom.NotFoundErr()
  626.  
  627.     
  628.     def removeNamedItemNS(self, namespaceURI, localName):
  629.         n = self.getNamedItemNS(namespaceURI, localName)
  630.         if n is not None:
  631.             _clear_id_cache(self._ownerElement)
  632.             del self._attrsNS[(n.namespaceURI, n.localName)]
  633.             del self._attrs[n.nodeName]
  634.             if 'ownerElement' in n.__dict__:
  635.                 n.__dict__['ownerElement'] = None
  636.             
  637.             return n
  638.         raise xml.dom.NotFoundErr()
  639.  
  640.     
  641.     def setNamedItem(self, node):
  642.         if not isinstance(node, Attr):
  643.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(node), repr(self)))
  644.         isinstance(node, Attr)
  645.         old = self._attrs.get(node.name)
  646.         if old:
  647.             old.unlink()
  648.         
  649.         self._attrs[node.name] = node
  650.         self._attrsNS[(node.namespaceURI, node.localName)] = node
  651.         node.ownerElement = self._ownerElement
  652.         _clear_id_cache(node.ownerElement)
  653.         return old
  654.  
  655.     
  656.     def setNamedItemNS(self, node):
  657.         return self.setNamedItem(node)
  658.  
  659.     
  660.     def __delitem__(self, attname_or_tuple):
  661.         node = self[attname_or_tuple]
  662.         _clear_id_cache(node.ownerElement)
  663.         node.unlink()
  664.  
  665.     
  666.     def __getstate__(self):
  667.         return (self._attrs, self._attrsNS, self._ownerElement)
  668.  
  669.     
  670.     def __setstate__(self, state):
  671.         (self._attrs, self._attrsNS, self._ownerElement) = state
  672.  
  673.  
  674. defproperty(NamedNodeMap, 'length', doc = 'Number of nodes in the NamedNodeMap.')
  675. AttributeList = NamedNodeMap
  676.  
  677. class TypeInfo(object):
  678.     __slots__ = ('namespace', 'name')
  679.     
  680.     def __init__(self, namespace, name):
  681.         self.namespace = namespace
  682.         self.name = name
  683.  
  684.     
  685.     def __repr__(self):
  686.         if self.namespace:
  687.             return '<TypeInfo %r (from %r)>' % (self.name, self.namespace)
  688.         return '<TypeInfo %r>' % self.name
  689.  
  690.     
  691.     def _get_name(self):
  692.         return self.name
  693.  
  694.     
  695.     def _get_namespace(self):
  696.         return self.namespace
  697.  
  698.  
  699. _no_type = TypeInfo(None, None)
  700.  
  701. class Element(Node):
  702.     nodeType = Node.ELEMENT_NODE
  703.     nodeValue = None
  704.     schemaType = _no_type
  705.     _magic_id_nodes = 0
  706.     _child_node_types = (Node.ELEMENT_NODE, Node.PROCESSING_INSTRUCTION_NODE, Node.COMMENT_NODE, Node.TEXT_NODE, Node.CDATA_SECTION_NODE, Node.ENTITY_REFERENCE_NODE)
  707.     
  708.     def __init__(self, tagName, namespaceURI = EMPTY_NAMESPACE, prefix = None, localName = None):
  709.         self.tagName = self.nodeName = tagName
  710.         self.prefix = prefix
  711.         self.namespaceURI = namespaceURI
  712.         self.childNodes = NodeList()
  713.         self._attrs = { }
  714.         self._attrsNS = { }
  715.  
  716.     
  717.     def _get_localName(self):
  718.         return self.tagName.split(':', 1)[-1]
  719.  
  720.     
  721.     def _get_tagName(self):
  722.         return self.tagName
  723.  
  724.     
  725.     def unlink(self):
  726.         for attr in self._attrs.values():
  727.             attr.unlink()
  728.         
  729.         self._attrs = None
  730.         self._attrsNS = None
  731.         Node.unlink(self)
  732.  
  733.     
  734.     def getAttribute(self, attname):
  735.         
  736.         try:
  737.             return self._attrs[attname].value
  738.         except KeyError:
  739.             return ''
  740.  
  741.  
  742.     
  743.     def getAttributeNS(self, namespaceURI, localName):
  744.         
  745.         try:
  746.             return self._attrsNS[(namespaceURI, localName)].value
  747.         except KeyError:
  748.             return ''
  749.  
  750.  
  751.     
  752.     def setAttribute(self, attname, value):
  753.         attr = self.getAttributeNode(attname)
  754.         if attr is None:
  755.             attr = Attr(attname)
  756.             d = attr.__dict__
  757.             d['value'] = d['nodeValue'] = value
  758.             d['ownerDocument'] = self.ownerDocument
  759.             self.setAttributeNode(attr)
  760.         elif value != attr.value:
  761.             d = attr.__dict__
  762.             d['value'] = d['nodeValue'] = value
  763.             if attr.isId:
  764.                 _clear_id_cache(self)
  765.             
  766.         
  767.  
  768.     
  769.     def setAttributeNS(self, namespaceURI, qualifiedName, value):
  770.         (prefix, localname) = _nssplit(qualifiedName)
  771.         attr = self.getAttributeNodeNS(namespaceURI, localname)
  772.         if attr is None:
  773.             attr = Attr(qualifiedName, namespaceURI, localname, prefix)
  774.             d = attr.__dict__
  775.             d['prefix'] = prefix
  776.             d['nodeName'] = qualifiedName
  777.             d['value'] = d['nodeValue'] = value
  778.             d['ownerDocument'] = self.ownerDocument
  779.             self.setAttributeNode(attr)
  780.         else:
  781.             d = attr.__dict__
  782.             if value != attr.value:
  783.                 d['value'] = d['nodeValue'] = value
  784.                 if attr.isId:
  785.                     _clear_id_cache(self)
  786.                 
  787.             
  788.             if attr.prefix != prefix:
  789.                 d['prefix'] = prefix
  790.                 d['nodeName'] = qualifiedName
  791.             
  792.  
  793.     
  794.     def getAttributeNode(self, attrname):
  795.         return self._attrs.get(attrname)
  796.  
  797.     
  798.     def getAttributeNodeNS(self, namespaceURI, localName):
  799.         return self._attrsNS.get((namespaceURI, localName))
  800.  
  801.     
  802.     def setAttributeNode(self, attr):
  803.         if attr.ownerElement not in (None, self):
  804.             raise xml.dom.InuseAttributeErr('attribute node already owned')
  805.         attr.ownerElement not in (None, self)
  806.         old1 = self._attrs.get(attr.name, None)
  807.         if old1 is not None:
  808.             self.removeAttributeNode(old1)
  809.         
  810.         old2 = self._attrsNS.get((attr.namespaceURI, attr.localName), None)
  811.         if old2 is not None and old2 is not old1:
  812.             self.removeAttributeNode(old2)
  813.         
  814.         _set_attribute_node(self, attr)
  815.         if old1 is not attr:
  816.             return old1
  817.         if old2 is not attr:
  818.             return old2
  819.  
  820.     setAttributeNodeNS = setAttributeNode
  821.     
  822.     def removeAttribute(self, name):
  823.         
  824.         try:
  825.             attr = self._attrs[name]
  826.         except KeyError:
  827.             raise xml.dom.NotFoundErr()
  828.  
  829.         self.removeAttributeNode(attr)
  830.  
  831.     
  832.     def removeAttributeNS(self, namespaceURI, localName):
  833.         
  834.         try:
  835.             attr = self._attrsNS[(namespaceURI, localName)]
  836.         except KeyError:
  837.             raise xml.dom.NotFoundErr()
  838.  
  839.         self.removeAttributeNode(attr)
  840.  
  841.     
  842.     def removeAttributeNode(self, node):
  843.         if node is None:
  844.             raise xml.dom.NotFoundErr()
  845.         node is None
  846.         
  847.         try:
  848.             self._attrs[node.name]
  849.         except KeyError:
  850.             raise xml.dom.NotFoundErr()
  851.  
  852.         _clear_id_cache(self)
  853.         node.unlink()
  854.         node.ownerDocument = self.ownerDocument
  855.  
  856.     removeAttributeNodeNS = removeAttributeNode
  857.     
  858.     def hasAttribute(self, name):
  859.         return self._attrs.has_key(name)
  860.  
  861.     
  862.     def hasAttributeNS(self, namespaceURI, localName):
  863.         return self._attrsNS.has_key((namespaceURI, localName))
  864.  
  865.     
  866.     def getElementsByTagName(self, name):
  867.         return _get_elements_by_tagName_helper(self, name, NodeList())
  868.  
  869.     
  870.     def getElementsByTagNameNS(self, namespaceURI, localName):
  871.         return _get_elements_by_tagName_ns_helper(self, namespaceURI, localName, NodeList())
  872.  
  873.     
  874.     def __repr__(self):
  875.         return '<DOM Element: %s at %#x>' % (self.tagName, id(self))
  876.  
  877.     
  878.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  879.         writer.write(indent + '<' + self.tagName)
  880.         attrs = self._get_attributes()
  881.         a_names = attrs.keys()
  882.         a_names.sort()
  883.         for a_name in a_names:
  884.             writer.write(' %s="' % a_name)
  885.             _write_data(writer, attrs[a_name].value)
  886.             writer.write('"')
  887.         
  888.         if self.childNodes:
  889.             writer.write('>%s' % newl)
  890.             for node in self.childNodes:
  891.                 node.writexml(writer, indent + addindent, addindent, newl)
  892.             
  893.             writer.write('%s</%s>%s' % (indent, self.tagName, newl))
  894.         else:
  895.             writer.write('/>%s' % newl)
  896.  
  897.     
  898.     def _get_attributes(self):
  899.         return NamedNodeMap(self._attrs, self._attrsNS, self)
  900.  
  901.     
  902.     def hasAttributes(self):
  903.         if self._attrs:
  904.             return True
  905.         return False
  906.  
  907.     
  908.     def setIdAttribute(self, name):
  909.         idAttr = self.getAttributeNode(name)
  910.         self.setIdAttributeNode(idAttr)
  911.  
  912.     
  913.     def setIdAttributeNS(self, namespaceURI, localName):
  914.         idAttr = self.getAttributeNodeNS(namespaceURI, localName)
  915.         self.setIdAttributeNode(idAttr)
  916.  
  917.     
  918.     def setIdAttributeNode(self, idAttr):
  919.         if idAttr is None or not self.isSameNode(idAttr.ownerElement):
  920.             raise xml.dom.NotFoundErr()
  921.         not self.isSameNode(idAttr.ownerElement)
  922.         if _get_containing_entref(self) is not None:
  923.             raise xml.dom.NoModificationAllowedErr()
  924.         _get_containing_entref(self) is not None
  925.  
  926.  
  927. defproperty(Element, 'attributes', doc = 'NamedNodeMap of attributes on the element.')
  928. defproperty(Element, 'localName', doc = 'Namespace-local name of this element.')
  929.  
  930. def _set_attribute_node(element, attr):
  931.     _clear_id_cache(element)
  932.     element._attrs[attr.name] = attr
  933.     element._attrsNS[(attr.namespaceURI, attr.localName)] = attr
  934.     attr.__dict__['ownerElement'] = element
  935.  
  936.  
  937. class Childless:
  938.     '''Mixin that makes childless-ness easy to implement and avoids
  939.     the complexity of the Node methods that deal with children.
  940.     '''
  941.     attributes = None
  942.     childNodes = EmptyNodeList()
  943.     firstChild = None
  944.     lastChild = None
  945.     
  946.     def _get_firstChild(self):
  947.         pass
  948.  
  949.     
  950.     def _get_lastChild(self):
  951.         pass
  952.  
  953.     
  954.     def appendChild(self, node):
  955.         raise xml.dom.HierarchyRequestErr(self.nodeName + ' nodes cannot have children')
  956.  
  957.     
  958.     def hasChildNodes(self):
  959.         return False
  960.  
  961.     
  962.     def insertBefore(self, newChild, refChild):
  963.         raise xml.dom.HierarchyRequestErr(self.nodeName + ' nodes do not have children')
  964.  
  965.     
  966.     def removeChild(self, oldChild):
  967.         raise xml.dom.NotFoundErr(self.nodeName + ' nodes do not have children')
  968.  
  969.     
  970.     def replaceChild(self, newChild, oldChild):
  971.         raise xml.dom.HierarchyRequestErr(self.nodeName + ' nodes do not have children')
  972.  
  973.  
  974.  
  975. class ProcessingInstruction(Childless, Node):
  976.     nodeType = Node.PROCESSING_INSTRUCTION_NODE
  977.     
  978.     def __init__(self, target, data):
  979.         self.target = self.nodeName = target
  980.         self.data = self.nodeValue = data
  981.  
  982.     
  983.     def _get_data(self):
  984.         return self.data
  985.  
  986.     
  987.     def _set_data(self, value):
  988.         d = self.__dict__
  989.         d['data'] = d['nodeValue'] = value
  990.  
  991.     
  992.     def _get_target(self):
  993.         return self.target
  994.  
  995.     
  996.     def _set_target(self, value):
  997.         d = self.__dict__
  998.         d['target'] = d['nodeName'] = value
  999.  
  1000.     
  1001.     def __setattr__(self, name, value):
  1002.         if name == 'data' or name == 'nodeValue':
  1003.             self.__dict__['data'] = self.__dict__['nodeValue'] = value
  1004.         elif name == 'target' or name == 'nodeName':
  1005.             self.__dict__['target'] = self.__dict__['nodeName'] = value
  1006.         else:
  1007.             self.__dict__[name] = value
  1008.  
  1009.     
  1010.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1011.         writer.write('%s<?%s %s?>%s' % (indent, self.target, self.data, newl))
  1012.  
  1013.  
  1014.  
  1015. class CharacterData(Childless, Node):
  1016.     
  1017.     def _get_length(self):
  1018.         return len(self.data)
  1019.  
  1020.     __len__ = _get_length
  1021.     
  1022.     def _get_data(self):
  1023.         return self.__dict__['data']
  1024.  
  1025.     
  1026.     def _set_data(self, data):
  1027.         d = self.__dict__
  1028.         d['data'] = d['nodeValue'] = data
  1029.  
  1030.     _get_nodeValue = _get_data
  1031.     _set_nodeValue = _set_data
  1032.     
  1033.     def __setattr__(self, name, value):
  1034.         if name == 'data' or name == 'nodeValue':
  1035.             self.__dict__['data'] = self.__dict__['nodeValue'] = value
  1036.         else:
  1037.             self.__dict__[name] = value
  1038.  
  1039.     
  1040.     def __repr__(self):
  1041.         data = self.data
  1042.         if len(data) > 10:
  1043.             dotdotdot = '...'
  1044.         else:
  1045.             dotdotdot = ''
  1046.         return '<DOM %s node "%r%s">' % (self.__class__.__name__, data[0:10], dotdotdot)
  1047.  
  1048.     
  1049.     def substringData(self, offset, count):
  1050.         if offset < 0:
  1051.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1052.         offset < 0
  1053.         if offset >= len(self.data):
  1054.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1055.         offset >= len(self.data)
  1056.         if count < 0:
  1057.             raise xml.dom.IndexSizeErr('count cannot be negative')
  1058.         count < 0
  1059.         return self.data[offset:offset + count]
  1060.  
  1061.     
  1062.     def appendData(self, arg):
  1063.         self.data = self.data + arg
  1064.  
  1065.     
  1066.     def insertData(self, offset, arg):
  1067.         if offset < 0:
  1068.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1069.         offset < 0
  1070.         if offset >= len(self.data):
  1071.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1072.         offset >= len(self.data)
  1073.         if arg:
  1074.             self.data = '%s%s%s' % (self.data[:offset], arg, self.data[offset:])
  1075.         
  1076.  
  1077.     
  1078.     def deleteData(self, offset, count):
  1079.         if offset < 0:
  1080.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1081.         offset < 0
  1082.         if offset >= len(self.data):
  1083.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1084.         offset >= len(self.data)
  1085.         if count < 0:
  1086.             raise xml.dom.IndexSizeErr('count cannot be negative')
  1087.         count < 0
  1088.         if count:
  1089.             self.data = self.data[:offset] + self.data[offset + count:]
  1090.         
  1091.  
  1092.     
  1093.     def replaceData(self, offset, count, arg):
  1094.         if offset < 0:
  1095.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1096.         offset < 0
  1097.         if offset >= len(self.data):
  1098.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1099.         offset >= len(self.data)
  1100.         if count < 0:
  1101.             raise xml.dom.IndexSizeErr('count cannot be negative')
  1102.         count < 0
  1103.         if count:
  1104.             self.data = '%s%s%s' % (self.data[:offset], arg, self.data[offset + count:])
  1105.         
  1106.  
  1107.  
  1108. defproperty(CharacterData, 'length', doc = 'Length of the string data.')
  1109.  
  1110. class Text(CharacterData):
  1111.     nodeType = Node.TEXT_NODE
  1112.     nodeName = '#text'
  1113.     attributes = None
  1114.     
  1115.     def splitText(self, offset):
  1116.         if offset < 0 or offset > len(self.data):
  1117.             raise xml.dom.IndexSizeErr('illegal offset value')
  1118.         offset > len(self.data)
  1119.         newText = self.__class__()
  1120.         newText.data = self.data[offset:]
  1121.         newText.ownerDocument = self.ownerDocument
  1122.         next = self.nextSibling
  1123.         if self.parentNode and self in self.parentNode.childNodes:
  1124.             if next is None:
  1125.                 self.parentNode.appendChild(newText)
  1126.             else:
  1127.                 self.parentNode.insertBefore(newText, next)
  1128.         
  1129.         self.data = self.data[:offset]
  1130.         return newText
  1131.  
  1132.     
  1133.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1134.         _write_data(writer, '%s%s%s' % (indent, self.data, newl))
  1135.  
  1136.     
  1137.     def _get_wholeText(self):
  1138.         L = [
  1139.             self.data]
  1140.         n = self.previousSibling
  1141.         while n is not None:
  1142.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1143.                 L.insert(0, n.data)
  1144.                 n = n.previousSibling
  1145.                 continue
  1146.             break
  1147.         n = self.nextSibling
  1148.         while n is not None:
  1149.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1150.                 L.append(n.data)
  1151.                 n = n.nextSibling
  1152.                 continue
  1153.             break
  1154.         return ''.join(L)
  1155.  
  1156.     
  1157.     def replaceWholeText(self, content):
  1158.         parent = self.parentNode
  1159.         n = self.previousSibling
  1160.         while n is not None:
  1161.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1162.                 next = n.previousSibling
  1163.                 parent.removeChild(n)
  1164.                 n = next
  1165.                 continue
  1166.             break
  1167.         n = self.nextSibling
  1168.         if not content:
  1169.             parent.removeChild(self)
  1170.         
  1171.         while n is not None:
  1172.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1173.                 next = n.nextSibling
  1174.                 parent.removeChild(n)
  1175.                 n = next
  1176.                 continue
  1177.             break
  1178.         if content:
  1179.             d = self.__dict__
  1180.             d['data'] = content
  1181.             d['nodeValue'] = content
  1182.             return self
  1183.         return None
  1184.  
  1185.     
  1186.     def _get_isWhitespaceInElementContent(self):
  1187.         if self.data.strip():
  1188.             return False
  1189.         elem = _get_containing_element(self)
  1190.         if elem is None:
  1191.             return False
  1192.         info = self.ownerDocument._get_elem_info(elem)
  1193.         if info is None:
  1194.             return False
  1195.         return info.isElementContent()
  1196.  
  1197.  
  1198. defproperty(Text, 'isWhitespaceInElementContent', doc = 'True iff this text node contains only whitespace and is in element content.')
  1199. defproperty(Text, 'wholeText', doc = 'The text of all logically-adjacent text nodes.')
  1200.  
  1201. def _get_containing_element(node):
  1202.     c = node.parentNode
  1203.     while c is not None:
  1204.         if c.nodeType == Node.ELEMENT_NODE:
  1205.             return c
  1206.         c = c.parentNode
  1207.         continue
  1208.         c.nodeType == Node.ELEMENT_NODE
  1209.  
  1210.  
  1211. def _get_containing_entref(node):
  1212.     c = node.parentNode
  1213.     while c is not None:
  1214.         if c.nodeType == Node.ENTITY_REFERENCE_NODE:
  1215.             return c
  1216.         c = c.parentNode
  1217.         continue
  1218.         c.nodeType == Node.ENTITY_REFERENCE_NODE
  1219.  
  1220.  
  1221. class Comment(Childless, CharacterData):
  1222.     nodeType = Node.COMMENT_NODE
  1223.     nodeName = '#comment'
  1224.     
  1225.     def __init__(self, data):
  1226.         self.data = self.nodeValue = data
  1227.  
  1228.     
  1229.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1230.         if '--' in self.data:
  1231.             raise ValueError("'--' is not allowed in a comment node")
  1232.         '--' in self.data
  1233.         writer.write('%s<!--%s-->%s' % (indent, self.data, newl))
  1234.  
  1235.  
  1236.  
  1237. class CDATASection(Text):
  1238.     nodeType = Node.CDATA_SECTION_NODE
  1239.     nodeName = '#cdata-section'
  1240.     
  1241.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1242.         if self.data.find(']]>') >= 0:
  1243.             raise ValueError("']]>' not allowed in a CDATA section")
  1244.         self.data.find(']]>') >= 0
  1245.         writer.write('<![CDATA[%s]]>' % self.data)
  1246.  
  1247.  
  1248.  
  1249. class ReadOnlySequentialNamedNodeMap(object):
  1250.     __slots__ = ('_seq',)
  1251.     
  1252.     def __init__(self, seq = ()):
  1253.         self._seq = seq
  1254.  
  1255.     
  1256.     def __len__(self):
  1257.         return len(self._seq)
  1258.  
  1259.     
  1260.     def _get_length(self):
  1261.         return len(self._seq)
  1262.  
  1263.     
  1264.     def getNamedItem(self, name):
  1265.         for n in self._seq:
  1266.             if n.nodeName == name:
  1267.                 return n
  1268.         
  1269.  
  1270.     
  1271.     def getNamedItemNS(self, namespaceURI, localName):
  1272.         for n in self._seq:
  1273.             if n.namespaceURI == namespaceURI and n.localName == localName:
  1274.                 return n
  1275.         
  1276.  
  1277.     
  1278.     def __getitem__(self, name_or_tuple):
  1279.         if isinstance(name_or_tuple, tuple):
  1280.             node = self.getNamedItemNS(*name_or_tuple)
  1281.         else:
  1282.             node = self.getNamedItem(name_or_tuple)
  1283.         if node is None:
  1284.             raise KeyError, name_or_tuple
  1285.         node is None
  1286.         return node
  1287.  
  1288.     
  1289.     def item(self, index):
  1290.         if index < 0:
  1291.             return None
  1292.         
  1293.         try:
  1294.             return self._seq[index]
  1295.         except IndexError:
  1296.             index < 0
  1297.             index < 0
  1298.             return None
  1299.  
  1300.  
  1301.     
  1302.     def removeNamedItem(self, name):
  1303.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1304.  
  1305.     
  1306.     def removeNamedItemNS(self, namespaceURI, localName):
  1307.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1308.  
  1309.     
  1310.     def setNamedItem(self, node):
  1311.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1312.  
  1313.     
  1314.     def setNamedItemNS(self, node):
  1315.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1316.  
  1317.     
  1318.     def __getstate__(self):
  1319.         return [
  1320.             self._seq]
  1321.  
  1322.     
  1323.     def __setstate__(self, state):
  1324.         self._seq = state[0]
  1325.  
  1326.  
  1327. defproperty(ReadOnlySequentialNamedNodeMap, 'length', doc = 'Number of entries in the NamedNodeMap.')
  1328.  
  1329. class Identified:
  1330.     '''Mix-in class that supports the publicId and systemId attributes.'''
  1331.     
  1332.     def _identified_mixin_init(self, publicId, systemId):
  1333.         self.publicId = publicId
  1334.         self.systemId = systemId
  1335.  
  1336.     
  1337.     def _get_publicId(self):
  1338.         return self.publicId
  1339.  
  1340.     
  1341.     def _get_systemId(self):
  1342.         return self.systemId
  1343.  
  1344.  
  1345.  
  1346. class DocumentType(Identified, Childless, Node):
  1347.     nodeType = Node.DOCUMENT_TYPE_NODE
  1348.     nodeValue = None
  1349.     name = None
  1350.     publicId = None
  1351.     systemId = None
  1352.     internalSubset = None
  1353.     
  1354.     def __init__(self, qualifiedName):
  1355.         self.entities = ReadOnlySequentialNamedNodeMap()
  1356.         self.notations = ReadOnlySequentialNamedNodeMap()
  1357.         if qualifiedName:
  1358.             (prefix, localname) = _nssplit(qualifiedName)
  1359.             self.name = localname
  1360.         
  1361.         self.nodeName = self.name
  1362.  
  1363.     
  1364.     def _get_internalSubset(self):
  1365.         return self.internalSubset
  1366.  
  1367.     
  1368.     def cloneNode(self, deep):
  1369.         if self.ownerDocument is None:
  1370.             clone = DocumentType(None)
  1371.             clone.name = self.name
  1372.             clone.nodeName = self.name
  1373.             operation = xml.dom.UserDataHandler.NODE_CLONED
  1374.             if deep:
  1375.                 clone.entities._seq = []
  1376.                 clone.notations._seq = []
  1377.                 for n in self.notations._seq:
  1378.                     notation = Notation(n.nodeName, n.publicId, n.systemId)
  1379.                     clone.notations._seq.append(notation)
  1380.                     n._call_user_data_handler(operation, n, notation)
  1381.                 
  1382.                 for e in self.entities._seq:
  1383.                     entity = Entity(e.nodeName, e.publicId, e.systemId, e.notationName)
  1384.                     entity.actualEncoding = e.actualEncoding
  1385.                     entity.encoding = e.encoding
  1386.                     entity.version = e.version
  1387.                     clone.entities._seq.append(entity)
  1388.                     e._call_user_data_handler(operation, n, entity)
  1389.                 
  1390.             
  1391.             self._call_user_data_handler(operation, self, clone)
  1392.             return clone
  1393.         return None
  1394.  
  1395.     
  1396.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1397.         writer.write('<!DOCTYPE ')
  1398.         writer.write(self.name)
  1399.         if self.publicId:
  1400.             writer.write("%s  PUBLIC '%s'%s  '%s'" % (newl, self.publicId, newl, self.systemId))
  1401.         elif self.systemId:
  1402.             writer.write("%s  SYSTEM '%s'" % (newl, self.systemId))
  1403.         
  1404.         if self.internalSubset is not None:
  1405.             writer.write(' [')
  1406.             writer.write(self.internalSubset)
  1407.             writer.write(']')
  1408.         
  1409.         writer.write('>' + newl)
  1410.  
  1411.  
  1412.  
  1413. class Entity(Identified, Node):
  1414.     attributes = None
  1415.     nodeType = Node.ENTITY_NODE
  1416.     nodeValue = None
  1417.     actualEncoding = None
  1418.     encoding = None
  1419.     version = None
  1420.     
  1421.     def __init__(self, name, publicId, systemId, notation):
  1422.         self.nodeName = name
  1423.         self.notationName = notation
  1424.         self.childNodes = NodeList()
  1425.         self._identified_mixin_init(publicId, systemId)
  1426.  
  1427.     
  1428.     def _get_actualEncoding(self):
  1429.         return self.actualEncoding
  1430.  
  1431.     
  1432.     def _get_encoding(self):
  1433.         return self.encoding
  1434.  
  1435.     
  1436.     def _get_version(self):
  1437.         return self.version
  1438.  
  1439.     
  1440.     def appendChild(self, newChild):
  1441.         raise xml.dom.HierarchyRequestErr('cannot append children to an entity node')
  1442.  
  1443.     
  1444.     def insertBefore(self, newChild, refChild):
  1445.         raise xml.dom.HierarchyRequestErr('cannot insert children below an entity node')
  1446.  
  1447.     
  1448.     def removeChild(self, oldChild):
  1449.         raise xml.dom.HierarchyRequestErr('cannot remove children from an entity node')
  1450.  
  1451.     
  1452.     def replaceChild(self, newChild, oldChild):
  1453.         raise xml.dom.HierarchyRequestErr('cannot replace children of an entity node')
  1454.  
  1455.  
  1456.  
  1457. class Notation(Identified, Childless, Node):
  1458.     nodeType = Node.NOTATION_NODE
  1459.     nodeValue = None
  1460.     
  1461.     def __init__(self, name, publicId, systemId):
  1462.         self.nodeName = name
  1463.         self._identified_mixin_init(publicId, systemId)
  1464.  
  1465.  
  1466.  
  1467. class DOMImplementation(DOMImplementationLS):
  1468.     _features = [
  1469.         ('core', '1.0'),
  1470.         ('core', '2.0'),
  1471.         ('core', '3.0'),
  1472.         ('core', None),
  1473.         ('xml', '1.0'),
  1474.         ('xml', '2.0'),
  1475.         ('xml', '3.0'),
  1476.         ('xml', None),
  1477.         ('ls-load', '3.0'),
  1478.         ('ls-load', None)]
  1479.     
  1480.     def hasFeature(self, feature, version):
  1481.         if version == '':
  1482.             version = None
  1483.         
  1484.         return (feature.lower(), version) in self._features
  1485.  
  1486.     
  1487.     def createDocument(self, namespaceURI, qualifiedName, doctype):
  1488.         if doctype and doctype.parentNode is not None:
  1489.             raise xml.dom.WrongDocumentErr('doctype object owned by another DOM tree')
  1490.         doctype.parentNode is not None
  1491.         doc = self._create_document()
  1492.         if namespaceURI is None and qualifiedName is None:
  1493.             pass
  1494.         add_root_element = not (doctype is None)
  1495.         if not qualifiedName and add_root_element:
  1496.             raise xml.dom.InvalidCharacterErr('Element with no name')
  1497.         add_root_element
  1498.         if add_root_element:
  1499.             (prefix, localname) = _nssplit(qualifiedName)
  1500.             if prefix == 'xml' and namespaceURI != 'http://www.w3.org/XML/1998/namespace':
  1501.                 raise xml.dom.NamespaceErr("illegal use of 'xml' prefix")
  1502.             namespaceURI != 'http://www.w3.org/XML/1998/namespace'
  1503.             if prefix and not namespaceURI:
  1504.                 raise xml.dom.NamespaceErr('illegal use of prefix without namespaces')
  1505.             not namespaceURI
  1506.             element = doc.createElementNS(namespaceURI, qualifiedName)
  1507.             if doctype:
  1508.                 doc.appendChild(doctype)
  1509.             
  1510.             doc.appendChild(element)
  1511.         
  1512.         if doctype:
  1513.             doctype.parentNode = doctype.ownerDocument = doc
  1514.         
  1515.         doc.doctype = doctype
  1516.         doc.implementation = self
  1517.         return doc
  1518.  
  1519.     
  1520.     def createDocumentType(self, qualifiedName, publicId, systemId):
  1521.         doctype = DocumentType(qualifiedName)
  1522.         doctype.publicId = publicId
  1523.         doctype.systemId = systemId
  1524.         return doctype
  1525.  
  1526.     
  1527.     def getInterface(self, feature):
  1528.         if self.hasFeature(feature, None):
  1529.             return self
  1530.         return None
  1531.  
  1532.     
  1533.     def _create_document(self):
  1534.         return Document()
  1535.  
  1536.  
  1537.  
  1538. class ElementInfo(object):
  1539.     '''Object that represents content-model information for an element.
  1540.  
  1541.     This implementation is not expected to be used in practice; DOM
  1542.     builders should provide implementations which do the right thing
  1543.     using information available to it.
  1544.  
  1545.     '''
  1546.     __slots__ = ('tagName',)
  1547.     
  1548.     def __init__(self, name):
  1549.         self.tagName = name
  1550.  
  1551.     
  1552.     def getAttributeType(self, aname):
  1553.         return _no_type
  1554.  
  1555.     
  1556.     def getAttributeTypeNS(self, namespaceURI, localName):
  1557.         return _no_type
  1558.  
  1559.     
  1560.     def isElementContent(self):
  1561.         return False
  1562.  
  1563.     
  1564.     def isEmpty(self):
  1565.         '''Returns true iff this element is declared to have an EMPTY
  1566.         content model.'''
  1567.         return False
  1568.  
  1569.     
  1570.     def isId(self, aname):
  1571.         '''Returns true iff the named attribte is a DTD-style ID.'''
  1572.         return False
  1573.  
  1574.     
  1575.     def isIdNS(self, namespaceURI, localName):
  1576.         '''Returns true iff the identified attribute is a DTD-style ID.'''
  1577.         return False
  1578.  
  1579.     
  1580.     def __getstate__(self):
  1581.         return self.tagName
  1582.  
  1583.     
  1584.     def __setstate__(self, state):
  1585.         self.tagName = state
  1586.  
  1587.  
  1588.  
  1589. def _clear_id_cache(node):
  1590.     if node.nodeType == Node.DOCUMENT_NODE:
  1591.         node._id_cache.clear()
  1592.         node._id_search_stack = None
  1593.     elif _in_document(node):
  1594.         node.ownerDocument._id_cache.clear()
  1595.         node.ownerDocument._id_search_stack = None
  1596.     
  1597.  
  1598.  
  1599. class Document(Node, DocumentLS):
  1600.     _child_node_types = (Node.ELEMENT_NODE, Node.PROCESSING_INSTRUCTION_NODE, Node.COMMENT_NODE, Node.DOCUMENT_TYPE_NODE)
  1601.     nodeType = Node.DOCUMENT_NODE
  1602.     nodeName = '#document'
  1603.     nodeValue = None
  1604.     attributes = None
  1605.     doctype = None
  1606.     parentNode = None
  1607.     previousSibling = None
  1608.     nextSibling = None
  1609.     implementation = DOMImplementation()
  1610.     actualEncoding = None
  1611.     encoding = None
  1612.     standalone = None
  1613.     version = None
  1614.     strictErrorChecking = False
  1615.     errorHandler = None
  1616.     documentURI = None
  1617.     _magic_id_count = 0
  1618.     
  1619.     def __init__(self):
  1620.         self.childNodes = NodeList()
  1621.         self._elem_info = { }
  1622.         self._id_cache = { }
  1623.         self._id_search_stack = None
  1624.  
  1625.     
  1626.     def _get_elem_info(self, element):
  1627.         if element.namespaceURI:
  1628.             key = (element.namespaceURI, element.localName)
  1629.         else:
  1630.             key = element.tagName
  1631.         return self._elem_info.get(key)
  1632.  
  1633.     
  1634.     def _get_actualEncoding(self):
  1635.         return self.actualEncoding
  1636.  
  1637.     
  1638.     def _get_doctype(self):
  1639.         return self.doctype
  1640.  
  1641.     
  1642.     def _get_documentURI(self):
  1643.         return self.documentURI
  1644.  
  1645.     
  1646.     def _get_encoding(self):
  1647.         return self.encoding
  1648.  
  1649.     
  1650.     def _get_errorHandler(self):
  1651.         return self.errorHandler
  1652.  
  1653.     
  1654.     def _get_standalone(self):
  1655.         return self.standalone
  1656.  
  1657.     
  1658.     def _get_strictErrorChecking(self):
  1659.         return self.strictErrorChecking
  1660.  
  1661.     
  1662.     def _get_version(self):
  1663.         return self.version
  1664.  
  1665.     
  1666.     def appendChild(self, node):
  1667.         if node.nodeType not in self._child_node_types:
  1668.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(node), repr(self)))
  1669.         node.nodeType not in self._child_node_types
  1670.         if node.parentNode is not None:
  1671.             node.parentNode.removeChild(node)
  1672.         
  1673.         if node.nodeType == Node.ELEMENT_NODE and self._get_documentElement():
  1674.             raise xml.dom.HierarchyRequestErr('two document elements disallowed')
  1675.         self._get_documentElement()
  1676.         return Node.appendChild(self, node)
  1677.  
  1678.     
  1679.     def removeChild(self, oldChild):
  1680.         
  1681.         try:
  1682.             self.childNodes.remove(oldChild)
  1683.         except ValueError:
  1684.             raise xml.dom.NotFoundErr()
  1685.  
  1686.         oldChild.nextSibling = None
  1687.         oldChild.previousSibling = None
  1688.         oldChild.parentNode = None
  1689.         if self.documentElement is oldChild:
  1690.             self.documentElement = None
  1691.         
  1692.         return oldChild
  1693.  
  1694.     
  1695.     def _get_documentElement(self):
  1696.         for node in self.childNodes:
  1697.             if node.nodeType == Node.ELEMENT_NODE:
  1698.                 return node
  1699.         
  1700.  
  1701.     
  1702.     def unlink(self):
  1703.         if self.doctype is not None:
  1704.             self.doctype.unlink()
  1705.             self.doctype = None
  1706.         
  1707.         Node.unlink(self)
  1708.  
  1709.     
  1710.     def cloneNode(self, deep):
  1711.         if not deep:
  1712.             return None
  1713.         clone = self.implementation.createDocument(None, None, None)
  1714.         clone.encoding = self.encoding
  1715.         clone.standalone = self.standalone
  1716.         clone.version = self.version
  1717.         for n in self.childNodes:
  1718.             childclone = _clone_node(n, deep, clone)
  1719.             if not childclone.ownerDocument.isSameNode(clone):
  1720.                 raise AssertionError
  1721.             clone.childNodes.append(childclone)
  1722.             if childclone.nodeType == Node.DOCUMENT_NODE:
  1723.                 if not clone.documentElement is None:
  1724.                     raise AssertionError
  1725.             elif childclone.nodeType == Node.DOCUMENT_TYPE_NODE:
  1726.                 if not clone.doctype is None:
  1727.                     raise AssertionError
  1728.                 clone.doctype = childclone
  1729.             
  1730.             childclone.parentNode = clone
  1731.         
  1732.         self._call_user_data_handler(xml.dom.UserDataHandler.NODE_CLONED, self, clone)
  1733.         return clone
  1734.  
  1735.     
  1736.     def createDocumentFragment(self):
  1737.         d = DocumentFragment()
  1738.         d.ownerDocument = self
  1739.         return d
  1740.  
  1741.     
  1742.     def createElement(self, tagName):
  1743.         e = Element(tagName)
  1744.         e.ownerDocument = self
  1745.         return e
  1746.  
  1747.     
  1748.     def createTextNode(self, data):
  1749.         if not isinstance(data, StringTypes):
  1750.             raise TypeError, 'node contents must be a string'
  1751.         isinstance(data, StringTypes)
  1752.         t = Text()
  1753.         t.data = data
  1754.         t.ownerDocument = self
  1755.         return t
  1756.  
  1757.     
  1758.     def createCDATASection(self, data):
  1759.         if not isinstance(data, StringTypes):
  1760.             raise TypeError, 'node contents must be a string'
  1761.         isinstance(data, StringTypes)
  1762.         c = CDATASection()
  1763.         c.data = data
  1764.         c.ownerDocument = self
  1765.         return c
  1766.  
  1767.     
  1768.     def createComment(self, data):
  1769.         c = Comment(data)
  1770.         c.ownerDocument = self
  1771.         return c
  1772.  
  1773.     
  1774.     def createProcessingInstruction(self, target, data):
  1775.         p = ProcessingInstruction(target, data)
  1776.         p.ownerDocument = self
  1777.         return p
  1778.  
  1779.     
  1780.     def createAttribute(self, qName):
  1781.         a = Attr(qName)
  1782.         a.ownerDocument = self
  1783.         a.value = ''
  1784.         return a
  1785.  
  1786.     
  1787.     def createElementNS(self, namespaceURI, qualifiedName):
  1788.         (prefix, localName) = _nssplit(qualifiedName)
  1789.         e = Element(qualifiedName, namespaceURI, prefix)
  1790.         e.ownerDocument = self
  1791.         return e
  1792.  
  1793.     
  1794.     def createAttributeNS(self, namespaceURI, qualifiedName):
  1795.         (prefix, localName) = _nssplit(qualifiedName)
  1796.         a = Attr(qualifiedName, namespaceURI, localName, prefix)
  1797.         a.ownerDocument = self
  1798.         a.value = ''
  1799.         return a
  1800.  
  1801.     
  1802.     def _create_entity(self, name, publicId, systemId, notationName):
  1803.         e = Entity(name, publicId, systemId, notationName)
  1804.         e.ownerDocument = self
  1805.         return e
  1806.  
  1807.     
  1808.     def _create_notation(self, name, publicId, systemId):
  1809.         n = Notation(name, publicId, systemId)
  1810.         n.ownerDocument = self
  1811.         return n
  1812.  
  1813.     
  1814.     def getElementById(self, id):
  1815.         if id in self._id_cache:
  1816.             return self._id_cache[id]
  1817.         if not self._elem_info or self._magic_id_count:
  1818.             return None
  1819.         stack = self._id_search_stack
  1820.         if stack is None:
  1821.             stack = [
  1822.                 self.documentElement]
  1823.             self._id_search_stack = stack
  1824.         elif not stack:
  1825.             return None
  1826.         id in self._id_cache
  1827.         result = None
  1828.         for child in node.childNodes:
  1829.             if child.nodeType in _nodeTypes_with_children:
  1830.                 continue
  1831.             _[1][child]
  1832.             [](_[1])
  1833.             info = self._get_elem_info(node)
  1834.             if info:
  1835.                 for attr in node.attributes.values():
  1836.                     if attr.namespaceURI:
  1837.                         if info.isIdNS(attr.namespaceURI, attr.localName):
  1838.                             self._id_cache[attr.value] = node
  1839.                             if attr.value == id:
  1840.                                 result = node
  1841.                             elif not node._magic_id_nodes:
  1842.                                 break
  1843.                             
  1844.                         
  1845.                     info.isIdNS(attr.namespaceURI, attr.localName)
  1846.                     if info.isId(attr.name):
  1847.                         self._id_cache[attr.value] = node
  1848.                         if attr.value == id:
  1849.                             result = node
  1850.                         elif not node._magic_id_nodes:
  1851.                             break
  1852.                         
  1853.                     attr.value == id
  1854.                     if attr._is_id:
  1855.                         self._id_cache[attr.value] = node
  1856.                         if attr.value == id:
  1857.                             result = node
  1858.                         elif node._magic_id_nodes == 1:
  1859.                             break
  1860.                         
  1861.                     attr.value == id
  1862.                 
  1863.             elif node._magic_id_nodes:
  1864.                 for attr in node.attributes.values():
  1865.                     if attr._is_id:
  1866.                         self._id_cache[attr.value] = node
  1867.                         if attr.value == id:
  1868.                             result = node
  1869.                         
  1870.                     attr.value == id
  1871.                 
  1872.             
  1873.             if result is not None:
  1874.                 break
  1875.                 continue
  1876.         return result
  1877.  
  1878.     
  1879.     def getElementsByTagName(self, name):
  1880.         return _get_elements_by_tagName_helper(self, name, NodeList())
  1881.  
  1882.     
  1883.     def getElementsByTagNameNS(self, namespaceURI, localName):
  1884.         return _get_elements_by_tagName_ns_helper(self, namespaceURI, localName, NodeList())
  1885.  
  1886.     
  1887.     def isSupported(self, feature, version):
  1888.         return self.implementation.hasFeature(feature, version)
  1889.  
  1890.     
  1891.     def importNode(self, node, deep):
  1892.         if node.nodeType == Node.DOCUMENT_NODE:
  1893.             raise xml.dom.NotSupportedErr('cannot import document nodes')
  1894.         node.nodeType == Node.DOCUMENT_NODE
  1895.         if node.nodeType == Node.DOCUMENT_TYPE_NODE:
  1896.             raise xml.dom.NotSupportedErr('cannot import document type nodes')
  1897.         node.nodeType == Node.DOCUMENT_TYPE_NODE
  1898.         return _clone_node(node, deep, self)
  1899.  
  1900.     
  1901.     def writexml(self, writer, indent = '', addindent = '', newl = '', encoding = None):
  1902.         if encoding is None:
  1903.             writer.write('<?xml version="1.0" ?>' + newl)
  1904.         else:
  1905.             writer.write('<?xml version="1.0" encoding="%s"?>%s' % (encoding, newl))
  1906.         for node in self.childNodes:
  1907.             node.writexml(writer, indent, addindent, newl)
  1908.         
  1909.  
  1910.     
  1911.     def renameNode(self, n, namespaceURI, name):
  1912.         if n.ownerDocument is not self:
  1913.             raise xml.dom.WrongDocumentErr('cannot rename nodes from other documents;\nexpected %s,\nfound %s' % (self, n.ownerDocument))
  1914.         n.ownerDocument is not self
  1915.         if n.nodeType not in (Node.ELEMENT_NODE, Node.ATTRIBUTE_NODE):
  1916.             raise xml.dom.NotSupportedErr('renameNode() only applies to element and attribute nodes')
  1917.         n.nodeType not in (Node.ELEMENT_NODE, Node.ATTRIBUTE_NODE)
  1918.         if namespaceURI != EMPTY_NAMESPACE:
  1919.             if ':' in name:
  1920.                 (prefix, localName) = name.split(':', 1)
  1921.                 if prefix == 'xmlns' and namespaceURI != xml.dom.XMLNS_NAMESPACE:
  1922.                     raise xml.dom.NamespaceErr("illegal use of 'xmlns' prefix")
  1923.                 namespaceURI != xml.dom.XMLNS_NAMESPACE
  1924.             elif name == 'xmlns' and namespaceURI != xml.dom.XMLNS_NAMESPACE and n.nodeType == Node.ATTRIBUTE_NODE:
  1925.                 raise xml.dom.NamespaceErr("illegal use of the 'xmlns' attribute")
  1926.             
  1927.             prefix = None
  1928.             localName = name
  1929.         else:
  1930.             prefix = None
  1931.             localName = None
  1932.         if n.nodeType == Node.ATTRIBUTE_NODE:
  1933.             element = n.ownerElement
  1934.             if element is not None:
  1935.                 is_id = n._is_id
  1936.                 element.removeAttributeNode(n)
  1937.             
  1938.         else:
  1939.             element = None
  1940.         d = n.__dict__
  1941.         d['prefix'] = prefix
  1942.         d['localName'] = localName
  1943.         d['namespaceURI'] = namespaceURI
  1944.         d['nodeName'] = name
  1945.         if n.nodeType == Node.ELEMENT_NODE:
  1946.             d['tagName'] = name
  1947.         else:
  1948.             d['name'] = name
  1949.             if element is not None:
  1950.                 element.setAttributeNode(n)
  1951.                 if is_id:
  1952.                     element.setIdAttributeNode(n)
  1953.                 
  1954.             
  1955.         return n
  1956.  
  1957.  
  1958. defproperty(Document, 'documentElement', doc = 'Top-level element of this document.')
  1959.  
  1960. def _clone_node(node, deep, newOwnerDocument):
  1961.     '''
  1962.     Clone a node and give it the new owner document.
  1963.     Called by Node.cloneNode and Document.importNode
  1964.     '''
  1965.     if node.ownerDocument.isSameNode(newOwnerDocument):
  1966.         operation = xml.dom.UserDataHandler.NODE_CLONED
  1967.     else:
  1968.         operation = xml.dom.UserDataHandler.NODE_IMPORTED
  1969.     if node.nodeType == Node.ELEMENT_NODE:
  1970.         clone = newOwnerDocument.createElementNS(node.namespaceURI, node.nodeName)
  1971.         for attr in node.attributes.values():
  1972.             clone.setAttributeNS(attr.namespaceURI, attr.nodeName, attr.value)
  1973.             a = clone.getAttributeNodeNS(attr.namespaceURI, attr.localName)
  1974.             a.specified = attr.specified
  1975.         
  1976.         if deep:
  1977.             for child in node.childNodes:
  1978.                 c = _clone_node(child, deep, newOwnerDocument)
  1979.                 clone.appendChild(c)
  1980.             
  1981.         
  1982.     elif node.nodeType == Node.DOCUMENT_FRAGMENT_NODE:
  1983.         clone = newOwnerDocument.createDocumentFragment()
  1984.         if deep:
  1985.             for child in node.childNodes:
  1986.                 c = _clone_node(child, deep, newOwnerDocument)
  1987.                 clone.appendChild(c)
  1988.             
  1989.         
  1990.     elif node.nodeType == Node.TEXT_NODE:
  1991.         clone = newOwnerDocument.createTextNode(node.data)
  1992.     elif node.nodeType == Node.CDATA_SECTION_NODE:
  1993.         clone = newOwnerDocument.createCDATASection(node.data)
  1994.     elif node.nodeType == Node.PROCESSING_INSTRUCTION_NODE:
  1995.         clone = newOwnerDocument.createProcessingInstruction(node.target, node.data)
  1996.     elif node.nodeType == Node.COMMENT_NODE:
  1997.         clone = newOwnerDocument.createComment(node.data)
  1998.     elif node.nodeType == Node.ATTRIBUTE_NODE:
  1999.         clone = newOwnerDocument.createAttributeNS(node.namespaceURI, node.nodeName)
  2000.         clone.specified = True
  2001.         clone.value = node.value
  2002.     elif node.nodeType == Node.DOCUMENT_TYPE_NODE:
  2003.         if not node.ownerDocument is not newOwnerDocument:
  2004.             raise AssertionError
  2005.         operation = xml.dom.UserDataHandler.NODE_IMPORTED
  2006.         clone = newOwnerDocument.implementation.createDocumentType(node.name, node.publicId, node.systemId)
  2007.         clone.ownerDocument = newOwnerDocument
  2008.         if deep:
  2009.             clone.entities._seq = []
  2010.             clone.notations._seq = []
  2011.             for n in node.notations._seq:
  2012.                 notation = Notation(n.nodeName, n.publicId, n.systemId)
  2013.                 notation.ownerDocument = newOwnerDocument
  2014.                 clone.notations._seq.append(notation)
  2015.                 if hasattr(n, '_call_user_data_handler'):
  2016.                     n._call_user_data_handler(operation, n, notation)
  2017.                     continue
  2018.                 node.ownerDocument is not newOwnerDocument
  2019.             
  2020.             for e in node.entities._seq:
  2021.                 entity = Entity(e.nodeName, e.publicId, e.systemId, e.notationName)
  2022.                 entity.actualEncoding = e.actualEncoding
  2023.                 entity.encoding = e.encoding
  2024.                 entity.version = e.version
  2025.                 entity.ownerDocument = newOwnerDocument
  2026.                 clone.entities._seq.append(entity)
  2027.                 if hasattr(e, '_call_user_data_handler'):
  2028.                     e._call_user_data_handler(operation, n, entity)
  2029.                     continue
  2030.             
  2031.         
  2032.     else:
  2033.         raise xml.dom.NotSupportedErr('Cannot clone node %s' % repr(node))
  2034.     if node.nodeType == Node.ELEMENT_NODE(node, '_call_user_data_handler'):
  2035.         node._call_user_data_handler(operation, node, clone)
  2036.     
  2037.     return clone
  2038.  
  2039.  
  2040. def _nssplit(qualifiedName):
  2041.     fields = qualifiedName.split(':', 1)
  2042.     if len(fields) == 2:
  2043.         return fields
  2044.     return (None, fields[0])
  2045.  
  2046.  
  2047. def _get_StringIO():
  2048.     StringIO = StringIO
  2049.     import StringIO
  2050.     return StringIO()
  2051.  
  2052.  
  2053. def _do_pulldom_parse(func, args, kwargs):
  2054.     events = func(*args, **kwargs)
  2055.     (toktype, rootNode) = events.getEvent()
  2056.     events.expandNode(rootNode)
  2057.     events.clear()
  2058.     return rootNode
  2059.  
  2060.  
  2061. def parse(file, parser = None, bufsize = None):
  2062.     '''Parse a file into a DOM by filename or file object.'''
  2063.     if parser is None and not bufsize:
  2064.         expatbuilder = expatbuilder
  2065.         import xml.dom
  2066.         return expatbuilder.parse(file)
  2067.     pulldom = pulldom
  2068.     import xml.dom
  2069.     return _do_pulldom_parse(pulldom.parse, (file,), {
  2070.         'parser': parser,
  2071.         'bufsize': bufsize })
  2072.  
  2073.  
  2074. def parseString(string, parser = None):
  2075.     '''Parse a file into a DOM from a string.'''
  2076.     if parser is None:
  2077.         expatbuilder = expatbuilder
  2078.         import xml.dom
  2079.         return expatbuilder.parseString(string)
  2080.     pulldom = pulldom
  2081.     import xml.dom
  2082.     return _do_pulldom_parse(pulldom.parseString, (string,), {
  2083.         'parser': parser })
  2084.  
  2085.  
  2086. def getDOMImplementation(features = None):
  2087.     if features:
  2088.         if isinstance(features, StringTypes):
  2089.             features = domreg._parse_feature_string(features)
  2090.         
  2091.         for f, v in features:
  2092.             if not Document.implementation.hasFeature(f, v):
  2093.                 return None
  2094.         
  2095.     
  2096.     return Document.implementation
  2097.  
  2098.